package com.honey.compilation.sql;

/**
 * sql92中定义数据库字段的约束如下:<br />
 * 
 * &lt;column constraint&gt; ::= NOT NULL | &lt;unique specification&gt;<br />
 * &lt;unique specification&gt; ::= UNIQUE | PRIMARY KEY
 * 
 * @author Administrator
 * 
 */
public abstract class SqlConstraint extends SqlElement {

	/** 使用掩码方式计算存在约束.  */
	private int constraint = 0x0;
	
	/**
	 * 添加约束实现类
	 * @param constraint
	 */
	public void addConstraint(SqlConstraint constraint) {
		addConstraint(constraint.getSQLConstraintType());
	}

	/**
	 * 
	 * 添加约束,约束已经添加,那么覆盖已有的约束.<br />
	 * 方法不能被覆盖
	 * @param constraint
	 */
	protected final void addConstraint(SQLConstraintType constraint) {
		this.constraint = this.constraint|constraint.mask;
	}
	
	/**
	 * 判断掩码是否存在<br />
	 * 方法不能被覆盖
	 * @param constraint
	 * @return
	 */
	protected final boolean isMask( SQLConstraintType constraint ){
		return constraint.mask == ( this.constraint&constraint.mask );
	}
	
	/**
	 * 是否存在Not null 的约束
	 */
	public final boolean isNotNullConstraint() {
		return isMask(SQLConstraintType.NOT_NULL);
	}

	/**
	 * 获取
	 * @return
	 */
	public SqlConstraint getNotNullConstraint() {
		return this;
	}
	
	/**
	 * 是否存在唯一约束
	 */
	public final boolean isUniqueConstraint() {
		return isMask(SQLConstraintType.UNIQUE);
	}

	/**
	 * 获取
	 * @return
	 */
	public SqlConstraint getUniqueConstraint() {
		return this;
	}
	
	/**
	 * 是否存在主键约束
	 */
	public final boolean isPrimaryKeyConstraint() {
		return isMask(SQLConstraintType.PRIMARY_KEY) ;
	}

	/**
	 * 获取
	 * @return
	 */
	public SqlConstraint getPrimaryKeyConstraint() {
		return this;
	}
	
	/**
	 * 是否存在检查约束
	 */
	public final boolean isCheckConstraint() {
		return isMask(SQLConstraintType.CHECK) ;
	}
	
	/**
	 * 获取
	 * @return
	 */
	public SqlConstraint getCheckConstraint() {
		return this;
	}
	
	/**
	 * 是否存在检查约束
	 */
	public final boolean isDefaultConstraint() {
		return isMask(SQLConstraintType.DEFAULT) ;
	}
	
	/**
	 * 获取
	 * @return
	 */
	public SqlConstraint getDefaultConstraint() {
		return this;
	}
	
	/**
	 * 获取约束类型 
	 * @return
	 */
	public abstract SQLConstraintType getSQLConstraintType() ;
	
	/**
	 * 约束定义
	 * @author Administrator
	 *
	 */
	protected  enum SQLConstraintType {

		/**
		 * 未定义约束
		 */
		UNDEFINE(0377), // 掩码1111 1111
		
		/**
		 * 唯一约束
		 */
		UNIQUE(01), // 掩码0000 0001
		
		/**
		 * 主键约束
		 */
		PRIMARY_KEY( 02), // 掩码0000 0010
		
		/**
		 * 不为空的约束
		 */
		NOT_NULL(04), // 掩码0000 0100
		
		/**
		 * 检查约束
		 */
		CHECK(010), // 掩码0000 1000
		
		/**
		 * 默认值约束
		 */
		DEFAULT(020), // 掩码0001 0000
		
		;
		
		/** 约束掩码  */
		private final int mask;
		
		/**
		 * 构造函数
		 * @param mask
		 */
		private SQLConstraintType( int mask) {
			
			this.mask = mask;
		}
	}
}
